# -*- coding: utf-8 -*-
"""
@Project: base_python
@File: crypto_price_reporter.py
@Author: PC
@Date: 2025/07/23
@Description: 
"""
# -*- coding: utf-8 -*-

import requests
import json

# 1. 全局常量定义
# CoinGecko API的基础URL
API_BASE_URL = "https://api.coingecko.com/api/v3"
# 目标计价货币
TARGET_CURRENCY = "usd"
# 根据设计文档确定的市值前10的加密货币ID列表
CRYPTO_IDS = [
    'bitcoin', 'ethereum', 'tether', 'binancecoin', 'solana',
    'usd-coin', 'ripple', 'dogecoin', 'cardano', 'tron'
]
# 为了美化输出，我们为每个ID关联一个更易读的名称
CRYPTO_NAMES = {
    'bitcoin': 'Bitcoin',
    'ethereum': 'Ethereum',
    'tether': 'Tether',
    'binancecoin': 'Binance Coin',
    'solana': 'Solana',
    'usd-coin': 'USD Coin',
    'ripple': 'XRP',
    'dogecoin': 'Dogecoin',
    'cardano': 'Cardano',
    'tron': 'TRON'
}

def get_crypto_prices(crypto_ids, currency):
    """
    调用CoinGecko API获取指定加密货币的价格。

    :param crypto_ids: 一个包含加密货币ID的列表。
    :param currency: 目标法定货币的字符串（例如'usd'）。
    :return: 包含价格数据的字典，如果失败则返回None。
    """
    # 将ID列表转换为API所需的逗号分隔字符串
    ids_string = ",".join(crypto_ids)
    
    # 构建请求参数字典
    params = {
        'ids': ids_string,
        'vs_currencies': currency
    }

    try:
        # 发送GET请求
        response = requests.get(f"{API_BASE_URL}/simple/price", params=params)
        # 检查API请求是否成功（HTTP状态码200）
        response.raise_for_status()  # 如果状态码不是2xx，将引发HTTPError
        
        # 将响应的JSON内容解析为Python字典
        return response.json()
    except requests.exceptions.HTTPError as http_err:
        # 处理HTTP错误
        print(f"HTTP错误: {http_err}")
    except requests.exceptions.RequestException as req_err:
        # 处理其他请求相关错误（如网络问题）
        print(f"请求错误: {req_err}")
    except json.JSONDecodeError:
        # 处理JSON解析错误
        print("解析API响应失败。")
        
    return None

def display_prices(price_data):
    """
    将价格数据格式化为易读的表格并在控制台打印。

    :param price_data: 从API获取的价格数据字典。
    """
    # 打印报告标题和分隔线
    print("======= Crypto Prices (USD) =======")
    print(f"{'Name':<15} {'Price':>20}")
    print("-" * 37)

    # 按照预定义的顺序遍历加密货币，以确保输出顺序一致
    for crypto_id in CRYPTO_IDS:
        # 检查返回的数据中是否存在该货币的信息
        if crypto_id in price_data and TARGET_CURRENCY in price_data[crypto_id]:
            # 获取可读名称和价格
            name = CRYPTO_NAMES.get(crypto_id, crypto_id.capitalize())
            price = price_data[crypto_id][TARGET_CURRENCY]
            
            # 格式化价格为带逗号和两位小数的美元字符串
            formatted_price = f"${price:,.2f}"
            
            # 打印格式化后的一行，左对齐名称，右对齐价格
            print(f"{name:<15} {formatted_price:>20}")
        else:
            # 如果某个货币的数据缺失，则打印提示信息
            name = CRYPTO_NAMES.get(crypto_id, crypto_id.capitalize())
            print(f"{name:<15} {'Data not available':>20}")

    # 打印报告的页脚分隔线
    print("=====================================")


def main():
    """
    主执行函数
    """
    print("正在从 CoinGecko API 获取最新的加密货币价格...")
    price_data = get_crypto_prices(CRYPTO_IDS, TARGET_CURRENCY)
    
    # 如果成功获取到数据，则显示价格报告
    if price_data:
        print("获取成功！\n")
        display_prices(price_data)
    else:
        # 如果获取数据失败，则打印错误信息
        print("\n无法获取价格数据，请检查网络连接或稍后重试。")

# 当脚本作为主程序执行时，运行main函数
if __name__ == "__main__":
    main()